package com.shm.didi;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

/**
 * 任务调度
 * 时间限制： 3000MS
 * 内存限制： 589824KB
 * 题目描述：
 * 优秀的操作系统离不开优秀的任务调度算法。现在，有一台计算机即将执行n个任务，每个任务都有一个准备阶段和执行阶段。只有在准备阶段完成后，执行阶段才可以开始。同一时间，计算机只能执行一个任务的执行阶段，同时可以执行任意多个任务的准备阶段。请你设计一个算法，合理分配任务执行顺序，并输出完成所有任务的最少时间。
 *
 *
 *
 * 输入描述
 * 第一行一个整数n表示任务的数量（1<=n<=5*10^4）
 *
 * 接下来n行每行两个整数a，b表示第i个任务的准备时长和执行时长。（1<=a,b<=10^9）
 *
 * 输出描述
 * 仅一行一个整数，表示执行所有任务的最少时间。
 *
 *
 * 样例输入
 * 2
 * 5 1
 * 2 4
 * 样例输出
 * 7
 * @author SHM
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        int n = Integer.parseInt(s);
        int[][] put = new int[n][2];
        for (int i = 0; i < n; i++) {
            String ss = sc.nextLine();
            String[] sp = ss.split(" ");
            put[i][0]=Integer.parseInt(sp[0]);
            put[i][1]=Integer.parseInt(sp[1]);
        }
        Arrays.sort(put, new Comparator<int[]>() {
            @Override
            public int compare(int[] x, int[] y) {
                if(x[0]!=y[0]){
                    return x[0]-y[0];
                }
                return x[0]+x[1]-y[0]-y[1];
            }
        });
        int ans=put[0][0]+put[0][1];
        for (int i = 1; i < n; i++) {
            if(ans<put[i][0]){
                ans=put[i][0];
            }
            ans+=put[i][1];
        }
        System.out.println(ans);
    }
}
